\documentclass[a4paper]{article}
\usepackage[a4paper,margin=2cm,top=2.0cm,bottom=2.34cm]{geometry}
\usepackage[spanish,activeacute]{babel}
\usepackage[T1]{fontenc}
\usepackage{algo2symb}
\usepackage{newalgo}

\parskip=1.5ex
\pagestyle{empty}

\newcommand\interfaz[5]{\noindent \\#1\ifblank{#2}\then{}\else{(#2)}\fi \ifblank{#3}\then{}\else{$\rightarrow$ #3}\fi \\ \{$#4$\} \\ \{$#5$\}}
\newcommand\estr[2]{\noindent \textbf{Estructura} \\#1 src estr\_#1 donde estr\_#1 es:\\ #2}
\newcommand\rep[2]{\noindent \textbf{Invariante de representacion} \\Rep: estr\_#1 $\rightarrow$ bool\\ Rep(e) = $#2$}
\newcommand\abs[3]{\noindent \textbf{Funcion de abstraccion} \\Abs: estr\_ #1 e $\rightarrow$ #1 \hspace{3em}(Rep(e))\\ Abs(e) = #2 / \\ $#3$}
\newcommand\complejidad[1]{\noindent \comentario{Complejidad: \Ode{#1}}}
% \param{in}{}{}
% \igobs
% {}_{0}
% \wedge

\begin{document}

\noindent \textbf{Modulo catalogo}

\noindent Se explica con la especificacion de catalogo \\
\textbf{usa:} arreglo\_redimensionable, conjunto, multiconj\_materiales

\noindent \textbf{Interfaz}

\noindent \comentario{Complejidad: O(n) donde n es la cantidad de viviendas en el catalogo}
\interfaz{Viviendas}{\param{in}{c}{catalogo}}{res\!: conj(vivienda)}{true}{res \igobs Viviendas(c)}

\complejidad{1}
\interfaz{Materiales}{\param{in}{c}{catalogo, \param{in}{v}{vivienda}}}{res\!: multiconj\_materiales}{v \in Viviendas(c)}{res \igobs Materiales(c,v)}

\complejidad{1}
\interfaz{Nuevo}{}{res\!: catalogo}{true}{res \igobs Nuevo}
\noindent \comentario{O(n) donde n es la cantidad de viviendas en el catalogo} \\
\comentario{No tomamos el parametro vivienda porque dado que como los identificadores de las viviendas van a ser naturales consecutivos comenzando desde 0, para simplificar un poco suponemos que los van a ingresar en el orden definido por los numeros. Entonces la clave del arreglo resulta ser el identificador de la vivienda.}

\interfaz{AgregarVivienda}{\param{inout}{c}{catalogo}, \param{in}{ms}{multiconj\_materiales}}{}{c \igobs {c}_{0} \wedge \neg v \in Viviendas(c)}{c \igobs AgregarVivienda(v,ms,{c}_{0})}

\complejidad{1}
\interfaz{CantidadViviendas}{\param{in}{c}{catalogo}}{res\!: nat}{true}{res \igobs \#(Viviendas(c))}

\complejidad{1}
\interfaz{CrearIterMateriales}{\param{in}{c}{catalogo}, \param{in}{v}{vivienda}}{res\!: iterMateriales}{v \in Viviendas(c)}{res \igobs CrearIterMateriales(Materiales(v,c))}

\estr{catalogo}{arreglo\_redimensionable(multiconj\_materiales)}

\rep{catalogo}{(\forall i\!: nat, 0 \leq i < Tam(e))\hspace{1em} definido(e[i])}

\abs{catalogo}{c}{Indices(e) \igobs Viviendas(c) \wedge (\forall v: vivienda, v \in Viviendas(c))\hspace{1em} e[v] \igobs materiales(c,v)}

\noindent \textbf{Algoritmos} \\

\begin{algorithm}{iViviendas}{\param{in}{c}{estr\_catalogo}}{res\!: conj(vivienda)}
res \= Vacio \\
\VAR{i\!: vivienda} \= 0 \\
\begin{WHILE}{i < iTam(c)}
	iAgregar(i,res) \\
	i++
\end{WHILE}
\end{algorithm}

\noindent \textit{\small{Las lineas 1,2,4,5 cuestan O(1), pero la 4 y la 5 las ejecuto n veces, donde n es la longitud de la lista c. Entonces la complejidad es O(n)}} \\

\begin{algorithm}{iMateriales}{\param{in}{c}{estr\_catalogo}, \param{in}{v}{vivienda}}{res\!: multiconj\_materiales}
res \= c[v]
\end{algorithm}

\begin{algorithm}{iNuevo}{}{res\!: catalogo}
res \= icrearArreglo(0)
\end{algorithm}

\begin{algorithm}{iAgregarVivienda}{\param{inout}{c}{estr\_catalogo}, \param{in}{ms}{multiconj\_materiales}}{}
Extender(c) \\
c[Tam(c) - 1] \= ms
\end{algorithm}

\noindent \textit{\small{Extender me cuesta O(n), donde n es la cantidad de viviendas en el catalogo, y la linea 2 O(1). Entonces la complejidad es O(n)}} \\

\begin{algorithm}{iCantidadViviendas}{\param{in}{c}{estr\_catalogo}}{res\!: nat}
	res \= iTam(c)
\end{algorithm}

\begin{algorithm}{iCrearIterMateriales}{\param{in}{c}{estr\_catalogo}, \param{in}{v}{vivienda}}{res\!: iterMateriales}
res \= iCrearIterMateriales(c[v])
\end{algorithm}

\end{document}
